//
//  MQHomeTableViewController.swift
//  MQWeibo
//
//  Created by 毛强 on 15/12/27.
//  Copyright © 2015年 itheima. All rights reserved.
//

import UIKit
import SVProgressHUD

class MQHomeTableViewController: MQVisitorTableViewController {

    // 可重用标识符
    private let MQHomeCellReUseId = "MQHomeCellReUseId"
    // 懒加载当前视图(tableView)对应的视图模型
    private lazy var statusListViewModel: MQStatusListViewModel = MQStatusListViewModel()
    
    // 定义模型数组，供 tableView 的数据源使用
    // 数据是由视图模型掌握，控制器的 view 不支持对接模型数据
    // private var statuses: [MQStatus]?
    // MARK: - 设置 UI
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 判断是否有登录
        if userLogin == false {
            // 设置内容
            visitorView.setupInfo(nil, messageText: nil)
            // 如果没有登录，下面的逻辑就不执行
            return
        }
        
        setupUI()
        // 加载首页数据
        loadData()
    }
    
    
    private func setupUI(){
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch", target: nil, action: "")
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop", target: self, action: "pop")
        
        setupTableView()
    }
    
    // 设置 tableView
    private func setupTableView(){
        // 注册cell
        tableView.registerClass(MQStatusCell.self, forCellReuseIdentifier: MQHomeCellReUseId)
        // 设置 tabelView 行高,自动计算行高
        tableView.rowHeight = UITableViewAutomaticDimension
        // 设置预估行高 --> 先让 tableView 能滚动，在滚动的时候再去计算显示的 cell 的真正的行高，并且调整 tabelView 的滚动范围
        tableView.estimatedRowHeight = 300
        // 隐藏分割线
        tableView.separatorStyle = .None
        
        tableView.backgroundColor = UIColor(white: 0.97, alpha: 1)
        
        tableView.tableFooterView = pullUpView
        
        mqRefreshControl.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        tableView.addSubview(mqRefreshControl)
    }
    
    // MARK: - 私有方法
    
    /// 加载首页数据
    @objc private func loadData(){
        
        // 只需要在这个方法里面关心是否加载成功就可以了
        statusListViewModel.loadData(pullUpView.isAnimating()) { (isSuccessed) -> () in
            // 如果请求成功，才去加载数据
            if isSuccessed {
                self.tableView.reloadData()
            }else{
                SVProgressHUD.showErrorWithStatus("请求失败")
            }
            self.endRefresh()
        }
        // 以下代码抽取到视图模型(MQStatusListViewModel)里面的loadData方法
        
    }
    
    private func endRefresh(){
        pullUpView.stopAnimating()
        mqRefreshControl.endRefreshing()
    }
    // MARK: - 监听方法
    
    @objc private func pop(){
        print("pop点击")
        // 要实现的功能：从第1级跳到第2级控制器里面，第2级控制器左上角显示第1级控制器的titlt
        // 从第2级往后 push 出来的新控制器左上角都显示返回
        let vc = MQTempViewController()
        navigationController?.pushViewController(vc, animated: true)
    }
    
    
    //MARK 懒加载控件
    //上拉加载的控件
    private lazy var pullUpView : UIActivityIndicatorView = {
        let indicator = UIActivityIndicatorView()
        indicator.activityIndicatorViewStyle = .WhiteLarge
        indicator.color = UIColor.purpleColor()
        return indicator
    }()
    
    private lazy var mqRefreshControl:MQRefreshControl = MQRefreshControl()
    
    
}

// MARK: - tableView 的数据源与代理方法
extension MQHomeTableViewController {
    
    // 返回有多少行数据
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statusListViewModel.statuses?.count ?? 0
    }
    
    // 返回每一行对应的 cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // 必须注册
        let cell = tableView.dequeueReusableCellWithIdentifier(MQHomeCellReUseId, forIndexPath: indexPath) as! MQStatusCell
        // 设置数据
        cell.statusViewModel = statusListViewModel.statuses![indexPath.row]
        //        cell.textLabel?.text = statusListViewModel.statuses![indexPath.row].status?.user?.screen_name
        return cell
    }
    
   override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    // 判断如果是将要显示最后一行cell 的话就去执行加载数据的操作
    // pullUpView.isAnimating() --> 代表当前是不是正在上拉加载
        if indexPath.row == statusListViewModel.statuses!.count - 1 && pullUpView.isAnimating() == false {
            print("去加载数据啦")
            // 开始动画
            pullUpView.startAnimating()
            // 加载数据
            loadData()
        }
    }
}
